// 公共方法和变量

// 本地IP 随时会变
export const localIp = '192.168.89.245'

// 远程IP
export const remoteIp = '8.137.37.23'

// 协议
export const protocol = 'http'

// 端口号
export const port = 6789

// 根据不同环境设置不同的基础URL
export const baseUrl = process.env.NODE_ENV === 'development' 
  ? (process.env.UNI_PLATFORM === 'app'
    ? `${protocol}://${localIp}:${port}` // 真机调试环境使用实际IP
    : (process.env.UNI_PLATFORM === 'mp-weixin' 
      ? `${protocol}://localhost:${port}` // 微信小程序开发环境使用代理
      : `${protocol}://localhost:${port}`)) // 开发环境使用代理
  : `${protocol}://${remoteIp}:${port}` // 生产环境使用实际地址

// 实际项目中需要从环境变量或配置文件中获取WebSocket地址
export const wsUrl = process.env.NODE_ENV === 'development'  
    ? (process.env.UNI_PLATFORM === 'app'
      ? `ws://${localIp}:6789` // 真机调试环境使用实际IP
      : (process.env.UNI_PLATFORM === 'mp-weixin'
        ? `ws://localhost:6789` // 微信小程序开发环境
        : `ws://localhost:6789`)) // 开发环境使用代理
    : `ws://${remoteIp}:6789`


/**
 * 获取默认账号
 * @returns {string} 默认账号
 */
export const getDefaultAccount = (): string => {
  // #ifdef MP-WEIXIN
  // 微信小程序默认账号
  return process.env.NODE_ENV === 'development' ? 'tj' : '';
  // #endif
  
  // #ifndef MP-WEIXIN
  // 其他平台默认账号
  return process.env.NODE_ENV === 'development' ? 'admin' : '';
  // #endif
};

/**
 * 检查是否已登录
 * @returns {boolean} 是否已登录
 */
export const isLoggedIn = (): boolean => {
  return !!uni.getStorageSync('userInfo')
}

/**
 * 获取用户信息
 * @returns {Object|null} 用户信息对象或null
 */
export const getUserInfo = (): Object | null => {
  return uni.getStorageSync('userInfo') || null
}

/**
 * 显示提示信息
 * @param title 提示标题
 * @param icon 图标类型
 */
export const showToast = (title: string, icon: 'success' | 'loading' | 'none' = 'none') => {
  uni.showToast({
    title,
    icon
  })
}

/**
 * 显示模态框
 * @param title 标题
 * @param content 内容
 * @returns Promise
 */
export const showModal = (title: string, content: string): Promise<any> => {
  return new Promise((resolve, reject) => {
    uni.showModal({
      title,
      content,
      success: function (res) {
        if (res.confirm) {
          resolve(true)
        } else if (res.cancel) {
          resolve(false)
        }
      },
      fail: function (err) {
        reject(err)
      }
    })
  })
}

/**
 * 导航到指定页面
 * @param url 页面路径
 * @param type 导航类型
 */
export const navigateTo = (url: string, type: 'navigate' | 'redirect' | 'switchTab' | 'reLaunch' = 'navigate') => {
  switch (type) {
    case 'navigate':
      uni.navigateTo({ url })
      break
    case 'redirect':
      uni.redirectTo({ url })
      break
    case 'switchTab':
      // 对于自定义tabbar，我们使用事件方式切换tab
      switchTabByPath(url)
      break
    case 'reLaunch':
      uni.reLaunch({ url })
      break
    default:
      uni.navigateTo({ url })
  }
}

/**
 * 通过页面路径切换tab
 * @param path 页面路径
 */
export const switchTabByPath = (path: string) => {
  // 定义页面路径与tab索引的映射关系
  const pathToIndexMap: Record<string, number> = {
    '/pages/home/home': 0,
    '/pages/video/video': 1,
    '/pages/publish/publish': 2,
    '/pages/message/message': 3,
    '/pages/profile/profile': 4
  }
  
  // 获取对应的tab索引
  const tabIndex = pathToIndexMap[path]
  
  if (tabIndex !== undefined) {
    // 通过事件通知index页面切换tab
    uni.$emit('switchTab', tabIndex)
  } else {
    console.warn(`未找到路径 ${path} 对应的tab索引`)
  }
}

/**
 * 清除用户登录状态
 */
export const clearLoginStatus = () => {
  uni.removeStorageSync('userInfo')
  uni.removeStorageSync('token')
}

/**
 * 格式化时间
 * @param date 日期对象或时间戳
 * @param format 格式化字符串
 * @returns 格式化后的时间字符串
 */
export const formatTime = (date: Date | number, format = 'YYYY-MM-DD HH:mm:ss'): string => {
  let d: Date
  
  if (typeof date === 'number') {
    d = new Date(date)
  } else {
    d = date
  }
  
  const year = d.getFullYear()
  const month = String(d.getMonth() + 1).padStart(2, '0')
  const day = String(d.getDate()).padStart(2, '0')
  const hour = String(d.getHours()).padStart(2, '0')
  const minute = String(d.getMinutes()).padStart(2, '0')
  const second = String(d.getSeconds()).padStart(2, '0')
  
  return format
    .replace('YYYY', String(year))
    .replace('MM', month)
    .replace('DD', day)
    .replace('HH', hour)
    .replace('mm', minute)
    .replace('ss', second)
}

/**
 * 日期格式化逻辑
 * @param date 日期对象
 * @param now 当前时间
 * @returns 格式化后的时间字符串
 */
const formatDateLogic = (date: Date, now: Date): string => {
  const diff = now.getTime() - date.getTime();

  if (diff < 0) {
    // 未来时间
    return '刚刚';
  } else if (diff < 60000) { // 1分钟内
    return '刚刚';
  } else if (diff < 3600000) { // 1小时内
    return `${Math.floor(diff / 60000)}分钟前`;
  } else if (diff < 86400000) { // 1天内
    return `${Math.floor(diff / 3600000)}小时前`;
  } else {
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
  }
};

/**
 * 格式化相对时间 (用于显示"几分钟前"、"几小时前"等)
 * @param dateString 日期字符串
 * @returns 格式化后的时间字符串
 */
export const formatDate = (dateString: string): string => {
  // 处理空值或无效值
  if (!dateString) {
    return '未知时间';
  }
  
  let date: Date;
  const now = new Date();
  
  // 如果是标准格式 "yyyy-MM-dd HH:mm:ss"
  if (dateString && dateString.includes('-') && dateString.includes(' ')) {
    // 将 "yyyy-MM-dd HH:mm:ss" 格式转换为 "yyyy/MM/dd HH:mm:ss" 以兼容iOS
    const iosCompatibleString = dateString.replace(/-/g, '/').replace(' ', ' ');
    date = new Date(iosCompatibleString);
    
    // 如果转换后日期无效，尝试其他格式
    if (isNaN(date.getTime())) {
      // 尝试将空格替换为 T 并添加 Z 后缀
      const altFormat = dateString.replace(' ', 'T') + 'Z';
      date = new Date(altFormat);
    }
  } else {
    // 直接尝试解析日期
    date = new Date(dateString);
  }
  
  // 检查日期是否有效
  if (isNaN(date.getTime())) {
    return '未知时间';
  }
  
  return formatDateLogic(date, now);
};

/**
 * 防抖函数
 * @param func 需要防抖的函数
 * @param delay 延迟时间(毫秒)
 * @returns 防抖后的函数
 */
export const debounce = (func: Function, delay: number) => {
  let timer: number | null = null
  return function (...args: any[]) {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      // @ts-ignore
      func.apply(this, args)
    }, delay)
  }
}

/**
 * 节流函数
 * @param func 需要节流的函数
 * @param delay 延迟时间(毫秒)
 * @returns 节流后的函数
 */
export const throttle = (func: Function, delay: number) => {
  let lastTime = 0
  return function (...args: any[]) {
    const now = Date.now()
    if (now - lastTime >= delay) {
      // @ts-ignore
      func.apply(this, args)
      lastTime = now
    }
  }
}

/**
 * 解析日期字符串，处理iOS兼容性问题
 * @param dateString 日期字符串
 * @returns Date对象
 */
export const parseDate = (dateString: string): Date => {
  // 处理空值或无效值
  if (!dateString) {
    return new Date();
  }
  
  let date: Date;
  
  // 如果是标准格式 "yyyy-MM-dd HH:mm:ss"
  if (dateString && dateString.includes('-') && dateString.includes(' ')) {
    // 将 "yyyy-MM-dd HH:mm:ss" 格式转换为 "yyyy/MM/dd HH:mm:ss" 以兼容iOS
    const iosCompatibleString = dateString.replace(/-/g, '/').replace(' ', ' ');
    date = new Date(iosCompatibleString);
    
    // 如果转换后日期无效，尝试其他格式
    if (isNaN(date.getTime())) {
      // 尝试将空格替换为 T 并添加 Z 后缀
      const altFormat = dateString.replace(' ', 'T') + 'Z';
      date = new Date(altFormat);
    }
  } else {
    // 直接尝试解析日期
    date = new Date(dateString);
  }
  
  // 检查日期是否有效
  if (isNaN(date.getTime())) {
    return new Date();
  }
  
  return date;
}
